"""
客户端代码
"""
import sys
from socket import *
import time


class FTPClient:
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.address = (host, port)
        self.sock = self.create_tcp()  # 创建套接字

    def create_tcp(self):
        sock = socket()
        sock.connect(self.address)
        return sock

    def do_list(self):
        self.sock.send(b"LIST")  # 发送请求
        response = self.sock.recv(1024 * 1024).decode()
        tmp = response.split(" ")  # 解析响应，查看响应类型
        if tmp[0] == "OK":
            print(tmp[1])
        elif tmp[0] == "FAIL":
            print("文件库为空")

    def do_get(self, filename):
        request = "GET " + filename  # 声明请求类型以及请求下载文件夹内容
        self.sock.send(request.encode())  # 发送请求
        response = self.sock.recv(128)  # 收响应
        if response == b"OK":  # 如果得到想要响应开始下载文件
            fw = open(filename, "wb")  # 创建写入文件
            while True:
                data = self.sock.recv(1024)  # 循环写入收到##表示写入完毕
                if data == b"##":
                    break  # 表示传输完毕
                fw.write(data)
            fw.close()
        else:  # 没有得到下载文件该有的类型,打印没有该文件
            print("没有该文件")

    def do_put(self, filename):
        try:
            fr = open(filename, "rb")  # 打开文件
        except:
            print("文件不存在")
            return
        filename = filename.split("/")[-1]  # 获取文件名
        request = "PUT " + filename  # 发送请求与文件名
        self.sock.send(request.encode())
        response = self.sock.recv(1024)  # 接收响应是否可以进行上传
        if response == b"OK":  # 循环读取发送
            while True:
                data = fr.read(1024)
                if not data:
                    break
                self.sock.send(data)
            fr.close()
            time.sleep(0.1)
            self.sock.send(b"##")
        else:
            print("文件已存在")

    def do_quit(self):  # 发送退出请求
        self.sock.send(b"QUIT")
        self.sock.close()
        sys.exit("谢谢使用")  # 结束进程


class FTPVIEW:
    def __init__(self,host,port):
        self.ftpclient = FTPClient(host, port)  # 跨类调用

    def __play_menu(self):
        print("""
        =============== FTP文件服务===============
         1. 查看文件　　2.下载    3. 上传   4.退出
        ==========================================
        """)

    def __select_menu(self):
        cmd = input("请您选择你要实现的功能:")
        if cmd == "1":
            self.ftpclient.do_list()
        elif cmd == "2":
            filename = input("请输入要下载的文件")
            self.ftpclient.do_get(filename)  # 将文件名作为参数传给逻辑处理类进行具体操作
        elif cmd == "3":
            filename = input("请输入您要上传的文件")
            self.ftpclient.do_put(filename)  # 将文件名作为参数传给逻辑处理类进行具体操作
        elif cmd == "4":
            self.ftpclient.do_quit()
        else:
            print("输入有误请重新选择")

    def main(self):
        while True:
            self.__play_menu()  # 显示菜单
            self.__select_menu()  # 选择菜单


if __name__ == '__main__':
    ftp = FTPVIEW("127.0.0.1",1216)
    ftp.main()
